package server;

import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * De ServerController is de controller van het netwerk van ons programma.
 * @author David Covemaeker, Maarten Minnebo, Tim Van Thuyne, Toon Kint
 */

public class ServerController
{
	private Socket socket;
	private ServerReader sreader;
	private ServerWriter swriter;
	
	/**
	 * De constructor vraagt een Socket aan, aan de klasse Connector.
	 * Het maakt de ServerReader en -Writer aan en aan beide wordt de Socket meegegeven.
	 * De ServerReader wordt in een Thread uitgevoerd!
	 * @param server De gekozen server
	 * @param login De gekozen loginnaam
	 * @param port De gekozen poort
	 */
	public ServerController (String server, String login, int port) throws IOException
	{
		socket = Connector.connection(server, login, port);
		
		if(socket != null)
		{
			sreader = new ServerReader(socket);
			swriter = new ServerWriter(socket);
			
			ExecutorService threadExecutorService = Executors.newSingleThreadExecutor();
			threadExecutorService.execute(sreader);
			threadExecutorService.shutdown();
		}
	}

	/**
	 * Roept de writeLine methode van de ServerWriter op.
	 * Wordt opgeroepen om een speciale lijn door te geven. (Zoals bijv. een PING)
	 * @param line De weg te schrijven lijn
	 */
	public void writeLine (String line) throws IOException
	{
		swriter.writeLine(line);
	}
	
	/**
	 * Roept de sayLine methode van de ServerWriter op.
	 * Geeft een gewoon chatbericht door.
	 * @param channel De naam van het kanaal
	 * @param line
	 */
	public void sayLine (String channel, String line) throws IOException
	{
		swriter.sayLine(channel, line);
	}
	
	/**
	 * De methode getServerReader wordt opgeroepen in de IRCController wanneer er wordt geconnecteerd met het netwerk.
	 * De IRCController maakt van de ServerReader een observer.
	 * @return De ServerReader
	 */
	public ServerReader getServerReader()
	{
		return sreader;
	}
	
	public Socket getSocket()
	{
		return socket;
	}
	
	public void closeSocket() throws IOException
	{
		Connector.closeSocket();
	}
}
